﻿using System.Linq;
using COMMON;
using VO;
using System.Collections.Generic;
using System.Data.Common;
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data;

namespace DAL
{
    public class CampanhaStatusDAL
    {

        private Database db;
        private DbTransaction transaction;

        #region Construtor
        public CampanhaStatusDAL()
        {
            DaoFactory objFactory = new DaoFactory(Configuracao.ConnectionString());
            transaction = objFactory.transaction;
            db = objFactory.db;
        }
        #endregion

        #region Insert
        public int Insert(CampanhaStatus obj)
        {
            int idCampanhaStatus = 0;
            using (var contexto = new CallcenterEntities())
            {
                var objC = new tbCCCampanha_Status();
                objC = PopulaObjeto(obj, objC);
                contexto.AddTotbCCCampanha_Status(objC);
                contexto.SaveChanges();
                idCampanhaStatus = objC.idCampanhaStatus;
            }
            return idCampanhaStatus;
        }
        #endregion

        #region Delete
        public void Delete(int idCampanhaStatus)
        {
            using (var contexto = new CallcenterEntities())
            {
                var campanha = (from campanhaAux in contexto.tbCCCampanha_Status
                                where campanhaAux.idCampanhaStatus == idCampanhaStatus
                                select campanhaAux).First();
                contexto.DeleteObject(campanha);
                contexto.SaveChanges();
            }
        }
        #endregion

        #region Select
        public IList<CampanhaStatus> Select(int idCampanha)
        {
            using (var contexto = new CallcenterEntities())
            {
                //IQueryable<tbCCCampanha_Status> campanha;

                var campanha = (from campanhaAux in contexto.tbCCCampanha_Status
                                join statusAux in contexto.tbCCStatusAtendimento on campanhaAux.idStatus equals statusAux.idStatus
                                where campanhaAux.idCampanha == idCampanha
                                select new
                                {
                                    campanhaAux.idCampanhaStatus,
                                    campanhaAux.idCampanha,
                                    campanhaAux.idStatus,
                                    statusAux.nome,
                                    campanhaAux.Qtd,
                                    campanhaAux.Dias,
                                    campanhaAux.fgBloqueio
                                }
                                );

                //Carrega lista
                var list = new List<CampanhaStatus>();
                foreach (var obj in campanha)
                {
                    var newObj = new CampanhaStatus();
                    newObj.idCampanhaStatus = obj.idCampanhaStatus;
                    newObj.idCampanha = obj.idCampanha;
                    newObj.idStatus = obj.idStatus;
                    newObj.nomeStatus = obj.nome;
                    newObj.fgBloqueio = obj.fgBloqueio != null && (bool)obj.fgBloqueio;
                    newObj.Qtd = obj.Qtd == null ? 0 : (int)obj.Qtd;
                    newObj.Dias = obj.Dias == null ? 0 : (int)obj.Dias;

                    list.Add(newObj);
                }

                //Carrega lista
                //var list = PopulaObjeto(campanha);

                return list;
            }
        }

        public IList<CampanhaStatus> Select(int idCampanha, int idStatus)
        {
            using (var contexto = new CallcenterEntities())
            {
                //IQueryable<tbCCCampanha_Status> campanha;

                var campanha = (from campanhaAux in contexto.tbCCCampanha_Status
                                join statusAux in contexto.tbCCStatusAtendimento on campanhaAux.idStatus equals statusAux.idStatus
                                where campanhaAux.idCampanha == idCampanha &&
                                (campanhaAux.idStatus == idStatus || idStatus == 0)
                                select new { campanhaAux.idCampanhaStatus, campanhaAux.idCampanha, campanhaAux.idStatus, statusAux.nome, campanhaAux.Dias, campanhaAux.Qtd });

                //Carrega lista
                var list = new List<CampanhaStatus>();
                foreach (var obj in campanha)
                {
                    var newObj = new CampanhaStatus
                                     {
                                         idCampanhaStatus = obj.idCampanhaStatus,
                                         idCampanha = obj.idCampanha,
                                         idStatus = obj.idStatus,
                                         nomeStatus = obj.nome,
                                         Qtd = obj.Qtd == null ? 0 : (int) obj.Qtd,
                                         Dias = obj.Dias == null ? 0 : (int) obj.Dias
                                     };


                    list.Add(newObj);
                }

                //Carrega lista
                //var list = PopulaObjeto(campanha);

                return list;
            }
        }

        public IList<CampanhaStatus> SelectRegra(int idCampanha, int idStatus, int qtdAtendimento)
        {
            using (var contexto = new CallcenterEntities())
            {
                //IQueryable<tbCCCampanha_Status> campanha;

                var campanha = (from campanhaAux in contexto.tbCCCampanha_Status
                                join statusRegra in contexto.tbCCCampanhaStatus_Regra on campanhaAux.idCampanhaStatus equals statusRegra.idCampanhaStatus
                                join statusAux in contexto.tbCCRegraAtendimento on statusRegra.idRegra equals statusAux.idRegraCallCenter
                                where campanhaAux.idCampanha == idCampanha &&
                                (campanhaAux.idStatus == idStatus || idStatus == 0) && (campanhaAux.Qtd == qtdAtendimento || qtdAtendimento == 0)
                                select new
                                {
                                    campanhaAux.idCampanhaStatus,
                                    campanhaAux.idCampanha,
                                    campanhaAux.idStatus,
                                    campanhaAux.Dias,
                                    campanhaAux.Qtd,
                                    statusAux.Sigla,
                                    statusRegra.idRegra,
                                    statusRegra.idCampanhaStatusRegra
                                });

                //Carrega lista
                var list = new List<CampanhaStatus>();
                foreach (var obj in campanha)
                {
                    var newObj = new CampanhaStatus
                    {
                        idCampanhaStatus = obj.idCampanhaStatus,
                        idCampanha = obj.idCampanha,
                        idStatus = obj.idStatus,
                        Qtd = obj.Qtd == null ? 0 : (int) obj.Qtd,
                        Dias = obj.Dias == null ? 0 : (int) obj.Dias,
                        idRegra = obj.idRegra,
                        SiglasRegra = obj.Sigla

                    };
                    list.Add(newObj);
                }

                //Carrega lista
                //var list = PopulaObjeto(campanha);

                return list;
            }
        }
        #endregion

        #region CopiaStatus
        public void CopiaStatus(int idCampanha, int idCampanhaNova)
        {
            DbCommand dbCommand = db.GetStoredProcCommand("IN_StatusCampanha");
            db.AddInParameter(dbCommand, "idCampanha", DbType.Int32, idCampanha);
            db.AddInParameter(dbCommand, "idCampanhaNova", DbType.Int32, idCampanhaNova);
            db.ExecuteNonQuery(dbCommand);
        }
        #endregion

        #region PopulaObjeto
        protected static tbCCCampanha_Status PopulaObjeto(CampanhaStatus obj, tbCCCampanha_Status tabela)
        {
            tabela.idCampanha = obj.idCampanha;
            tabela.idStatus = obj.idStatus;
            tabela.Qtd = obj.Qtd;
            tabela.Dias = obj.Dias;
            tabela.fgBloqueio = obj.fgBloqueio;
            return tabela;
        }
        #endregion


        #region Update
        public void Update(CampanhaStatus obj)
        {
            using (var contexto = new CallcenterEntities())
            {
                var campanha = (from campanhaAux in contexto.tbCCCampanha_Status
                                where campanhaAux.idCampanhaStatus == obj.idCampanhaStatus
                                select campanhaAux).First();
                PopulaObjeto(obj, campanha);
                contexto.SaveChanges();
            }
        }
        #endregion



    }
}